home *** CD-ROM | disk | FTP | other *** search
/ Eagles Nest BBS 8 / Eagles_Nest_Mac_Collection_Disc_8.TOAST / Developer Tools⁄Additions / InsideBa1994 / InsideBasic-94 / IB 94 / Apple Events / AEServer.bas < prev    next >
BASIC Source File  |  1993-08-30  |  16KB  |  497 lines

  1. WINDOW OFF:COORDINATE WINDOW
  2. RESOURCES "server.res","APPLAESV"
  3.  
  4. '=================================================
  5. '       AEServer
  6. '       Michael W. Faulkner 
  7. '       Inveterate Insomniac, Inc.
  8. '       Began   6/12/93   08:25  GMT
  9. '       Last Modified:       8/29/93
  10. '
  11. '       For brevity sake, I'll only comment
  12. '       the functions that are important for
  13. '       this example program
  14. '=================================================
  15.  
  16. '***************************************************************
  17. '*
  18. '*      CDEF Button references and menu items
  19. '*
  20. '***************************************************************
  21. _kAEOpenApp             =       1
  22. _kAEOpenDoc             =       2
  23. _kAEPrintDoc            =       3
  24. _kAEQuitApp             =       4
  25.  
  26.  
  27. _fileMenu = 2
  28. _receiverItem = 1
  29. _quitItem = 2
  30.  
  31. '=================================================
  32. '       Constants for Apple Events needed by
  33. '       this program.
  34. '
  35. '=================================================
  36. _errAEDescNotFound      = -1701
  37. _errAEEventNotHandled   = -1708
  38. _typeLongInteger        = _"long"
  39.  
  40. _kCoreEventClass        = _"aevt"
  41. _kAEOpenApplication     = _"oapp"
  42. _kAEOpenDocuments       = _"odoc"
  43. _kAEPrintDocuments      = _"pdoc"
  44. _kAEQuitApplication     = _"quit"
  45. _typeAEList             = _"list"
  46. _typeFSS                = _"fss "
  47. _keyDirectObject        = _"----"
  48. _keyErrorNumber         = _"errn"
  49.  
  50.  
  51. _kAENoReply             =       1
  52. _kAEQueueReply          =       2
  53. _kAEWaitReply           =       3
  54. _kAENeverInteract       =       16
  55. _kAECanInteract         =       32
  56. _kAEAlwaysInteract      =       48
  57. _kAECanSwitchLayer      =       64
  58. _kAEDontReconnect       =       128
  59. _kAutoGenerateReturnID  =       -1
  60. _kTransactionID         =       1
  61. _kAEDefaultTimeout      =       -1
  62. _kAENormalPriority      =       0
  63. _nil                    =       &00000000
  64. _sizeOfSign             =       &00000004
  65.  
  66. _typeApplSignature      =       _"sign"
  67. _typeWildCard           =       _"****"
  68. _AECL                   =       _"AECL"
  69. _AESV                   =       _"AESV"
  70.  
  71. _keyMissedKeywordAttr   =       _"miss"
  72.  
  73. _AECustomClass   = _"cstm"
  74. _AECustomEventID = _"mssg"
  75.  
  76. '***************************************************************
  77. '*
  78. '*      Apple Event Record Structures
  79. '*
  80. '***************************************************************
  81.  
  82. DIM RECORD AEDesc
  83.   DIM descType&
  84.   DIM descHandle&
  85. DIM END RECORD _AEDesc
  86.  
  87. DIM RECORD AEKeyDesc
  88.   DIM descKey&
  89.   DIM descContent.AEDesc
  90. DIM END RECORD _AEKeyDesc
  91.  
  92. DIM RECORD AEAddressDesc
  93.   DIM addressDesc.AEDesc
  94. DIM END RECORD _AEAddressDesc
  95.  
  96. DIM RECORD AEDescList
  97.   DIM descList.AEDesc
  98. DIM END RECORD _AEDescList
  99.  
  100. DIM RECORD AERecord
  101.   DIM recordDesList.AEDescList
  102. DIM END RECORD _AERecord
  103.  
  104. DIM RECORD AppleEvent
  105.   DIM AEEventRecord.AERecord
  106. DIM END RECORD _AppleEvent
  107.  
  108.  
  109. END GLOBALS
  110.  
  111. GOTO "main"
  112.  
  113. '**************************************************************
  114. '*
  115. '*      FN AECreateDesc(typeCode&,dataPtr&,dataSize&,result&)
  116. '*
  117. '*      Creates a new AEDesc Record for the AppleEvent
  118. '*      we need to build.
  119. '*
  120. '*      Selector: #$0825
  121. '*      Trap:     $A816 (_pack8)
  122. '*
  123. '*      Local variables: none
  124. '*
  125. '*      On entry:
  126. '*       typeCode& - long: type descriptor for AEDesc record
  127. '*       dataPtr&  - long: pointer to data for record
  128. '*       dataSize& - long: size of data in bytes
  129. '*       result&   - long: pointer to uninitialized AEDesc record
  130. '*
  131. '*      On exit:
  132. '*        result passed in D0
  133. '**************************************************************
  134. LOCAL MODE
  135. LOCAL FN AECreateDesc(typeCode&,dataPtr&,dataSize&,result&)
  136.   `     clr.w   -(sp)
  137.   `     move.l  ^typeCode&,-(sp)
  138.   `     move.l  ^dataPtr&,-(sp)
  139.   `     move.l  ^dataSize&,-(sp)
  140.   `     move.l  ^result&,-(sp)
  141.   `     move.w  #$0825,D0
  142.   `     dc.w    $A816
  143.   `     move.w  (sp)+,D0
  144.   `     ext.l   D0
  145. END FN
  146.  
  147.  
  148. '**************************************************************
  149. '*
  150. '*      FN AECreateAppleEvent(evtClass&,evtID&,desc&,returnID%,transID&,result&)
  151. '*
  152. '*      Creates new AppleEvent from AEDesc record
  153. '*
  154. '*      Selector: #$0B14
  155. '*      Trap:     $A816 (_pack8)
  156. '*      Local variables: none
  157. '*
  158. '*      On entry:
  159. '*       evtClass& - long: event class of the new AppleEvent
  160. '*       evtID&    - long: event ID of new AppleEvent
  161. '*       desc&     - long: pointer to AEDesc record
  162. '*       returnID% - integer: returnID generation flag
  163. '*       transID&  - long: transaction ID
  164. '*       result&   - long: pointer to record of type AppleEvent
  165. '*
  166. '*      On exit:
  167. '*       result passed in D0
  168. '**************************************************************
  169. LOCAL MODE
  170. LOCAL FN AECreateAppleEvent(evtClass&,evtID&,desc&,returnID%,transID&,result&)
  171.   `     subq.l  #2,sp
  172.   `     move.l  ^evtClass&,-(sp)
  173.   `     move.l  ^evtID&,-(sp)
  174.   `     move.l  ^desc&,-(sp)
  175.   `     move.w  ^returnID%,-(sp)
  176.   `     move.l  ^transID&,-(sp)
  177.   `     move.l  ^result&,-(sp)
  178.   `     move.w  #$0B14,D0
  179.   `     dc.w    $A816
  180.   `     move.w  (sp)+,D0
  181.   `     ext.l   D0
  182. END FN
  183.  
  184. '**************************************************************
  185. '*
  186. '*      FN AESend(aevent&,aereply&,interaction&,priority&,timeout%,idleProc&,filterProc&)
  187. '*
  188. '*      Sends the new AppleEvent on its merry way
  189. '*
  190. '*      Selector: #$0D17
  191. '*      Trap:     $A816 (_pack8)
  192. '*      Local variables: none
  193. '*
  194. '*      On entry:
  195. '*       aevent&      - long: pointer to AppleEvent
  196. '*       aereply&     - long: pointer to AppleEvent reply record
  197. '*       interaction& - long: level of user interaction
  198. '*       priority&    - long: priority of AppleEvent
  199. '*       timeout%     - integer: timeout in ticks (-1 = 60 secs)
  200. '*       idleProc&    - long: pointer to sys idle procedure (valid only if no timeout specified)
  201. '*       filterProc&  - long: pointer to AEFilter procedure (valid only if no timeout specified)
  202. '*     
  203. '*       On exit:
  204. '*        result passed in D0
  205. '**************************************************************
  206. LOCAL MODE
  207. LOCAL FN AESend(aevent&,aereply&,interaction&,priority&,timeout%,idleProc&,filterProc&)
  208.   `     subq.l  #2,sp
  209.   `     move.l  ^aevent&,-(sp)
  210.   `     move.l  ^aereply&,-(sp)
  211.   `     move.l  ^interaction&,-(sp)
  212.   `     move.l  ^priority&,-(sp)
  213.   `     move.w  ^timeout%,-(sp)
  214.   `     move.l  ^idleProc&,-(sp)
  215.   `     move.l  ^filterProc&,-(sp)
  216.   `     move.w  #$0D17,D0
  217.   `     dc.w    $A816
  218.   `     move.w  (sp)+,D0
  219.   `     ext.l   D0
  220. END FN
  221.  
  222.  
  223. '******************************************************************
  224. '*
  225. '*      FN AEPutParamPtr(newEvent&,keyword&,desc&,ptr&,dataSize&)
  226. '*
  227. '*      Attaches a parameter to a valid Apple event
  228. '*
  229. '*      Selector:       #$0A0F
  230. '*      Trap:           $A816
  231. '*
  232. '*      On Entry:
  233. '*              newEvent& : long -- pointer to Apple event
  234. '*              keyWord&  : long -- keyword which describes parameter
  235. '*              desc&     : long -- type descriptor for parameter
  236. '*              ptr&      : long -- pointer to data
  237. '*              dataSize& : long -- size of data pointed to
  238. '*
  239. '*      On exit:
  240. '*              result passed in D0
  241. '******************************************************************
  242. LOCAL MODE
  243. LOCAL FN AEPutParamPtr(newEvent&,keyword&,desc&,ptr&,dataSize&)
  244.   `     subq.l  #2,sp
  245.   `     move.l  ^newEvent&,-(sp)
  246.   `     move.l  ^keyword&,-(sp)
  247.   `     move.l  ^desc&,-(sp)
  248.   `     move.l  ^ptr&,-(sp)
  249.   `     move.l  ^dataSize&,-(sp)
  250.   `     move.w  #$0A0F,D0
  251.   `     dc.w    $A816
  252.   `     move.w  (sp)+,D0
  253.   `     ext.l   D0
  254. END FN
  255.  
  256. '******************************************************************
  257. '*
  258. '*      FN AEGetAttributePtr(theAEvent&,keyWord&,desiredType&,returnType&,bufferPtr&,bufferSize&,actualSize&)
  259. '*
  260. '*      Given an Apple event, extracts an attribute and places it in
  261. '*      the buffer provided.
  262. '*
  263. '*      Selector:       #$0E15
  264. '*      Trap:           $A816
  265. '*
  266. '*      On entry:
  267. '*              theAEvent&   : long -- pointer to Apple event
  268. '*              keyWord&     : long -- keyword of the attribute 
  269. '*              desiredType& : long -- the type descriptor the attribute is to be returned as
  270. '*              returnType&  : long -- the returned type descriptor of the attribute
  271. '*              bufferPtr&   : long -- pointer to buffer for the returned attribute
  272. '*              bufferSize&  : long -- size of the buffer
  273. '*              actualSize&  : long -- buffer for size to be returned to
  274. '*
  275. '*      On exit:
  276. '*              result returned in D0
  277. '******************************************************************
  278. LOCAL MODE
  279. LOCAL FN AEGetAttributePtr(theAEvent&,keyWord&,desiredType&,returnType&,bufferPtr&,bufferSize&,actualSize&)
  280.   `     clr.w   -(sp)
  281.   `     move.l  ^theAEvent&,-(sp)
  282.   `     move.l  ^keyWord&,-(sp)
  283.   `     move.l  ^desiredType&,-(sp)
  284.   `     move.l  ^returnType&,-(sp)
  285.   `     move.l  ^bufferPtr&,-(sp)
  286.   `     move.l  ^bufferSize&,-(sp)
  287.   `     move.l  ^actualSize&,-(sp)
  288.   `     move.w  #$0E15,D0
  289.   `     dc.w    $A816
  290.   `     move.w  (sp)+,D0
  291.   `     ext.l   D0
  292. END FN
  293.  
  294. '***************************************************************
  295. LOCAL FN InitWindow
  296.   LONG IF WINDOW(-1) = _nil
  297.     DIM wRect.8                           'Eight bytes for rectangle
  298.     DIM eRect.8                           'Eight bytes for rectangle
  299.     DIM title$
  300.     title$ = "AEvent Demo"
  301.     CALL SETRECT(wRect,10,50,300,200)
  302.     CALL SETRECT(eRect,10,10,200,25)
  303.     WINDOW #1,title$,@wRect,_docNoGrow
  304.     EDIT FIELD #1,"",@eRect,_statFramed
  305.   END IF
  306. END FN
  307. '**************************************************************
  308. '*
  309. '*      Apple Event handlers: All ignored
  310. '*
  311. '**************************************************************
  312.  
  313.  
  314. '**************************************************************
  315. '*
  316. '*      AEOpenApplication
  317. '*
  318. '**************************************************************
  319. "AEOpenApp"
  320. ENTERPROC(procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
  321.   EDIT FIELD 1,"AEOpenApplication"
  322.   err = _noErr
  323. EXITPROC = err
  324.  
  325. '**************************************************************
  326. '*
  327. '*      AEQuitApplication
  328. '*
  329. '**************************************************************
  330. "AEQuitApp"
  331. ENTERPROC(procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
  332.   'ignored
  333.   err = _noErr
  334.   EDIT FIELD 1,"AEQuitApplication"
  335.   END
  336. EXITPROC = err
  337.  
  338. '**************************************************************
  339. '*
  340. '*      AEPrintDocuments
  341. '*
  342. '**************************************************************
  343. "AEPrintDocs"
  344. ENTERPROC(procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
  345.   'Ignored
  346.   EDIT FIELD 1,"AEPrintDocuments"
  347. EXITPROC
  348.  
  349. '**************************************************************
  350. '*
  351. '*      AEOpenDocuments
  352. '*
  353. '**************************************************************
  354. "AEOpenDocs"
  355.  
  356. ENTERPROC(procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
  357.   'Ignored
  358.   EDIT FIELD 1,"AEOpenDocuments"
  359.   err = _noErr
  360. EXITPROC = err
  361.  
  362. '***************************************
  363. '*
  364. '*      FN CheckError(err)
  365. '*
  366. '*      Cheeper than dirt error handler...
  367. '*
  368. '******************************************
  369. LOCAL FN CheckError(theErr)               'See if error occured at calling routine
  370.   DIM whichErr$                           'Space for string
  371.   DIM junk                                'Don't care about button hit this time around
  372.   LONG IF theErr <> _noErr                'Oops. Non-zero if error
  373.     whichErr$ = STR$(theErr)              'Convert error to string
  374.     CALL PARAMTEXT(whichErr$,"","","")    'Shove it into alert
  375.     junk = FN ALERT(128,_nil)             'Notify user dude
  376.   END IF                                  'Done
  377. END FN = theErr                           'Return error to caller
  378.  
  379. '***************************************************************
  380. '*
  381. '*      "handleCustomEvent"
  382. '*
  383. '*      Once dropped into this handler, first, get the descriptor
  384. '*      record which has the text (ok, describes the parameter).
  385. '*      Then,, get the length of the text by retreiving the size
  386. '*      of the handle. Finally,  BLOCKMOVE the text into our local
  387. '*      string.
  388. '*
  389. '***************************************************************
  390. "handleCustomEvent"
  391. ENTERPROC (procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
  392.   DIM result.AEDesc                       'Work space for a copy of descriptor
  393.   DIM theText$                            'Buffer for text
  394.   DIM typeCode&                           'For returned type
  395.   
  396.   OSErr = _noErr                          'Assume all goody goody
  397.   
  398.   osErr = FN AEGETPARAMDESC (procAEvtPtr&,_keyDirectObject,_typeChar,result)
  399.   LONG IF osErr = _noErr
  400.     sz& = FN GETHANDLESIZE(result.descHandle&)'Lenght of text
  401.     IF sz& > 255 sz& = 255                'Don't pass end-o-buffer
  402.     POKE @theText$,sz&                    'Set-up length byte
  403.     BLOCKMOVE [result.descHandle&],@theText$+1,sz&'Got it!
  404.     theText$ = "You sent: "+theText$      'String for reply
  405.     
  406.     'Now, add are adjusted string to the Apple Event reply
  407.     
  408.     OSErr = FN AEPutParamPtr(procAEvtReplyPtr&,_keyDirectObject,_typeChar,@theText$+1,LEN(theText$))
  409.     LONG IF OSErr = _noErr
  410.       EDIT FIELD 1,theText$
  411.     XELSE
  412.       EDIT FIELD 1,"Error occured"
  413.     END IF
  414.   XELSE
  415.     EDIT FIELD 1,"Error"
  416.   END IF
  417.   OSErr = FN AEDISPOSEDESC(#@result)      'Done with result so tank it
  418.   
  419.   'See if we missed any other attributes
  420.   OSErr = FN AEGetAttributePtr(procAEvtPtr&,_keyMissedKeyWordAttr,_typeWildCard,@typeCode&,_nil,_nil,@sz&)
  421.   
  422.   IF OSErr = _errAEDescNotFound err& = _noErr ELSE err& = _errAEEventNotHandled
  423.   
  424.   'Put the error code in the reply to send back
  425.   OSErr = FN AEPutParamPtr(procAEvtReplyPtr&,_keyErrorNumber,_typeLongInteger,@err&,4)
  426.   
  427. EXITPROC = OSErr
  428.  
  429. '***************************************************************
  430. '*
  431. '*      Try to install the Apple event handlers. If we
  432. '*      can't, just end the program
  433. '*
  434. '***************************************************************
  435. LOCAL FN InstallAEvents
  436.   LONG IF SYSTEM(_sysVers) > 699
  437.     LONG IF FN GESTALT(_gestaltAppleEventsAttr)
  438.       &EVENT -8,3
  439.       gAEEventProcPtr& = LINE"AEOpenApp"
  440.       err = FN AEINSTALLEVENTHANDLER(_kCoreEventClass, _kAEOpenApplication,gAEEventProcPtr&,_false,_false)
  441.       LONG IF err = _noErr
  442.         gAEEventProcPtr& = LINE"AEQuitApp"
  443.         err = FN AEINSTALLEVENTHANDLER(_kCoreEventClass, _kAEQuitApplication,gAEEventProcPtr&,_false,_false)
  444.         LONG IF err = _noErr
  445.           gAEEventProcPtr& = LINE"AEOpenDocs"
  446.           err = FN AEINSTALLEVENTHANDLER(_kCoreEventClass, _kAEOpenDocuments,gAEEventProcPtr&,_false,_false)
  447.           LONG IF err = _noErr
  448.             gAEEventProcPtr& = LINE"AEPrintDocs"
  449.             err = FN AEINSTALLEVENTHANDLER(_kCoreEventClass, _kAEPrintDocuments,gAEEventProcPtr&,_false,_false)
  450.             LONG IF err = _noErr
  451.               gAEEventProcPtr& = LINE"handleCustomEvent"
  452.               err = FN AEINSTALLEVENTHANDLER(_AECustomClass,_AECustomEventID,gAEEventProcPtr&,_false,_false)
  453.             END IF
  454.           END IF
  455.         END IF
  456.       END IF
  457.     END IF
  458.   END IF
  459.   IF err <> _noErr THEN END
  460. END FN
  461.  
  462. '***************************************************************
  463. LOCAL FN DoMenu
  464.   menuID = MENU(_menuID) : menuItem = MENU(_itemID)'Get details
  465.   SELECT menuID                           'Only one menu anyway
  466.     CASE _fileMenu                        'Still only one menu
  467.       SELECT menuItem                     'Which item?
  468.         CASE _quitItem                    'Bye suka
  469.           END
  470.         CASE _receiverItem                'Build me a window
  471.           FN InitWindow
  472.       END SELECT
  473.   END SELECT
  474.   MENU                                    'Clean-up highlite
  475. END FN                                    'Outta here
  476.  
  477. '***************************************************************
  478. LOCAL FN DoDialog
  479.   evnt = DIALOG(0) : id = DIALOG(evnt)    'Which control?
  480.   SELECT evnt
  481.     CASE _wndClose                        'Only want close box
  482.       WINDOW CLOSE 1                      'Bye Bye
  483.   END SELECT
  484. END FN
  485. '***************************************************************
  486. "main"
  487.  
  488. FN InstallAEvents
  489. FN InitWindow
  490. ON MENU FN DoMenu
  491. ON DIALOG FN DoDialog
  492.  
  493. DO
  494.   HANDLEEVENTS
  495. UNTIL RomulansJoinTheFederationAndBecomeNice
  496. END
  497.